<?php

class search_dicionarioModel extends Model{
    
    /*
     * NUNCA, JAMAIS coloque nenhum destes campos com a ppção search, pois vai 
     * entrar em loop infinito e correrá o risco de encher o banco de dados
     */
    
    protected $disabled_index = true;
    protected $tabela = "search_dicionario";
    protected $pkey   = array("cod_documento", "cod_palavra");
    protected $dados  = array(
        
        'cod_documento' => array(
            'name'    => "Documento",
            'pkey'    => true,
            'type'    => 'int',
            'grid'    => true,
            'notnull' => true,
            'fkey'      => array(
                'model'    => 'search/documento', 
                'keys'     => array('cod_documento', 'link'),
                'cardinalidade' => '1n'
            )
         ),
        
        'cod_palavra' => array(
            'name'    => "Palavra",
            'pkey'    => true,
            'type'    => 'int',
            'grid'    => true,
            'notnull' => true,
            'fkey'      => array(
                'model'    => 'search/palavra', 
                'keys'     => array('cod_palavra', 'palavra'),
                'cardinalidade' => '1n'
            )
         ),
        
        'repeticoes' => array(
            'name'     => 'Número de repetições',
            'type'     => 'int',
            'size'     => '11',
            'notnull'  => true,
            'default'  => 1,
            'grid'     => true
         )
    );
    
    public function __construct() {
        parent::__construct();
        $this->LoadModel('search/palavra', 'pal');
        $this->LoadClassFromPlugin('search/alg/StemmingAlgorithm', 'salg');
    }
    
    public function indexar_palavras($cod_documento, $texto){
        
        //prepara o texto para indexar palavra por palavra
        $texto = str_replace(array("\n", "\t", "-"), ' ', $texto);
        $texto = explode(" ", $texto);
        
        //aplica o algoritmo de stemming e stop words em cada palavra
        $this->LoadModel('search/alg', 'alg');
        $words = array();
        foreach($texto as $txt){
            $txt = GetPlainName($txt, true, false);
            if($this->alg->ignoreWord($txt)) continue;
            if(strlen($txt) < 2) continue;
            $word = $this->salg->stem($txt);
            if(array_key_exists($word, $words))$words[$word]++; 
            else $words[$word] = 1;
        }
        
        //Verifica se as palavras a serem indexadas existem
        $lista = implode("','", array_keys($words));
        $palavras = $this->pal->selecionar(array(), "palavra IN('$lista')");
        $inserted = array();
        foreach($palavras as $palavra){
            $inserted[$palavra['palavra']] = $palavra['cod_palavra'];
        }
        
        //gera a query para inserir as palavras que nao existiam
        $tabela = $this->pal->getTable();
        $query = "INSERT INTO $tabela (`palavra`) VALUES ";
        $v = "";
        foreach($words as $word => $total){
            if(array_key_exists($word, $inserted)) continue;
            $query .= "$v('$word')";
            $v = ",";
        }
        $query .= ";";
        
        //insere as palavras que não existiam e seleciona todas que estão sendo indexadas
        if($v == ","){
            $this->db->executeQuery($query);
            $plv = $this->pal->selecionar(array(), "palavra IN('$lista')");
            $palavras = array();
            foreach($plv as $palavra){
                $palavras[$palavra['palavra']] = $palavra['cod_palavra'];
            }
        }else $palavras = $inserted;
        
        //seleciona as palavras já indexadas para um dado documento
        $lista2 = implode("','", $words);
        $out = array();
        $temp = $this->selecionar(array('cod_palavra'), "cod_documento = '$cod_documento' AND cod_palavra in ('$lista2')");
        foreach($temp as $t){
            $out[$t['cod_palavra']] = "";
        }
        
        //gera a query a ser colocada no dicionário
        $v = "";
        $query = "INSERT INTO $this->tabela (`cod_documento`, `cod_palavra`, `repeticoes`) VALUES";
        foreach($palavras as $palavra => $cod_palavra){
            if(array_key_exists($cod_palavra, $out)) continue;
            $repeticoes = $words[$palavra];
            $query .= "$v('$cod_documento', '$cod_palavra','$repeticoes')";
            $v = ",";
        }
        $query .= "; ";
        if($v == ",") $this->db->executeQuery($query);
        
    }
    
}

?>